package com.ifdom.dynamicproxy.dynamicstate;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

/**
 * 动态代理行为
 *
 * @Author ifredomvip@gmail.com
 * @Date 2022/9/15 14:30
 * @Version 1.0.0
 * @Description
 **/
public class DynamicProxyHandle implements InvocationHandler {

    // 创建一个对象，用来保存代理对象

    private Object landlord;

    /**
     * 保存代理对象
     *
     * @param landlord 房东
     */
    public void setLandlord(Object landlord) {
        this.landlord = landlord;
    }

    /**
     * 获得代理对象
     *
     * @return {@link Object}
     */
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), landlord.getClass().getInterfaces(), this);
    }

    /**
     * 处理代理示例，并返回结果
     *
     * @param proxy  代理
     * @param method 方法
     * @param args   arg游戏
     * @return {@link Object}
     * @throws Throwable throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 动态代理的本质是使用反射
        before();
        Object result = method.invoke(landlord, args);
        after();
        return result;
    }

    /**
     * 增强功能，调用invoke方法之前执行
     */
    private void before() {
        System.out.println(String.format("before time [%s] ", new Date()));
    }

    /**
     * 增强功能，调用invoke方法之后执行
     */
    private void after() {
        System.out.println(String.format("after time [%s] ", new Date()));
    }

}